#include <stdlib.h>
#include <stdbool.h>
#include "lista.h"

typedef struct _nodo{
        struct _nodo* siguiente;
        void* dato;
}nodo_t;// o lista_nodo_t no sé


struct lista{
        nodo_t* primero;
        nodo_t* ultimo;
        size_t largo;

};


struct iter{
        nodo_t* actual;
        nodo_t* anterior;
};



/*Crea un nodo.
Post: devuelve un puntero a un nodo*/
nodo_t* nodo_crear (void* valor){
        
        nodo_t* nodo = malloc(sizeof(nodo_t));
        if (!nodo) return NULL;
        nodo->dato = valor;
        nodo->siguiente = NULL;
        return nodo;
                
}


             
/*DOCUMENTAR*/
lista_t *lista_crear(){

       lista_t * lista = malloc(sizeof(lista_t));
       if (!lista) return NULL;
       lista->primero = lista->ultimo = NULL;
       lista->largo=NULL;
       return lista;
}
/*DOCUMENTAR*/
bool lista_esta_vacia(const lista_t *lista){

       return (lista->primero == NULL) && (lista->ultimo == NULL); 
}

/*DOCUMENTAR*/
bool lista_insertar_primero(lista_t *lista, void *dato){

     nodo_t* nodo = nodo_crear(dato);
     if (!nodo) return false;
     if (lista_esta_vacia(lista)){
       lista->primero = nodo;
       lista->largo+=1
     }else{ //Completar esta función
	}
}

/*DOCUMENTAR*/
bool lista_insertar_ultimo(lista_t *lista, void *dato){
     return false;
}



/*DOCUMENTAR*/
void *lista_borrar_primero(lista_t *lista){

    if (lista_esta_vacia(lista)) return NULL;
    lista->primero=lista->primero->siguiente //Continuar, me maree.
    lista->largo--;
  
  return NULL;
}

/*DOCUMENTAR*/
void *lista_ver_primero(const lista_t *lista){

    if(lista_esta_vacia(lista)) return NULL;
    return lista->primero->dato;
}


/*DOCUMENTAR*/
size_t lista_largo(const lista_t *lista){

    if (lista_esta_vacia(lista)) return NULL;
    return lista->largo;
}

/*DOCUMENTAR*/
void lista_destruir(lista_t *lista, void destruir_dato(void *)){

}


/*DOCUMENTAR*/
lista_iter_t *lista_iter_crear(const lista_t *lista){
        return NULL;
}



/*DOCUMENTAR*/
bool lista_iter_avanzar(lista_iter_t *iter){
        return false;
}

/*DOCUMENTAR*/
void *lista_iter_ver_actual(const lista_iter_t *iter){
        return NULL;
}


/*DOCUMENTAR*/
bool lista_iter_al_final(const lista_iter_t *iter){
        return false;
}

/*DOCUMENTAR*/
void lista_iter_destruir(lista_iter_t *iter){
}


/*DOCUMENTAR*/
bool lista_insertar(lista_t *lista, lista_iter_t *iter, void *dato){
        return false;
}


/*DOCUMENTAR*/

void *lista_borrar(lista_t *lista, lista_iter_t *iter){
        return NULL;
}